package com.cangshukj.system.service.impl;

import com.cangshukj.system.domain.SysRegion;
import com.cangshukj.system.domain.vo.RegionTreeSelect;
import com.cangshukj.system.mapper.SysRegionMapper;
import com.cangshukj.system.service.ISysRegionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 地区Service业务层处理
 * 
 * @author cangshukj
 * @date 2022-03-08
 */
@Service
public class SysRegionServiceImpl implements ISysRegionService
{
    @Autowired
    private SysRegionMapper sysRegionMapper;

    /**
     * 查询地区
     *
     * @param regionid 地区主键
     * @return 地区
     */
    @Override
    public SysRegion selectSysRegionByRegionid(String regionid)
    {
        return sysRegionMapper.selectSysRegionByRegionid(regionid);
    }
    /**
     * 根据pid查询子级地区
     *
     * @param parentId 父级id
     * @return 地区
     */
    @Override
    public List<SysRegion> selectSysRegionByPid(String parentId) {
        return sysRegionMapper.selectSysRegionByPid(parentId);
    }


    /**
     * 查询地区列表
     *
     * @param sysRegion 地区
     * @return 地区
     */
    @Override
    public List<SysRegion> selectSysRegionList(SysRegion sysRegion)
    {
        return sysRegionMapper.selectSysRegionList(sysRegion);
    }

    /**
     * 查询地区列表
     *
     * @param sysRegion 地区
     * @return 地区
     */
    @Override
    public List<SysRegion> selectRegionLevelList(SysRegion sysRegion)
    {
        return sysRegionMapper.selectRegionLevelList(sysRegion);
    }

    /**
     * 新增地区
     *
     * @param sysRegion 地区
     * @return 结果
     */
    @Override
    public int insertSysRegion(SysRegion sysRegion)
    {
        return sysRegionMapper.insertSysRegion(sysRegion);
    }

    /**
     * 修改地区
     *
     * @param sysRegion 地区
     * @return 结果
     */
    @Override
    public int updateSysRegion(SysRegion sysRegion)
    {
        return sysRegionMapper.updateSysRegion(sysRegion);
    }

    /**
     * 激活地区
     *
     * @param sysRegion 地区
     * @return 结果
     */
    @Override
    public int updateActivaStatus(SysRegion sysRegion)
    {
        String regionid = sysRegion.getRegionid();
        SysRegion inRegion = selectSysRegionByRegionid(regionid);
        int level = inRegion.getLevel();

        //市级地区
        if(level == 1){
            //市级ID 前缀
            String regionShi = regionid.substring(0,4);
            sysRegion.setRegionid(regionShi);
            return sysRegionMapper.updateActivaStatus(sysRegion);
        }else{
            return sysRegionMapper.updateSysRegion(sysRegion);
        }
    }

    /**
     * 批量删除地区
     *
     * @param regionids 需要删除的地区主键
     * @return 结果
     */
    @Override
    public int deleteSysRegionByRegionids(String[] regionids)
    {
        return sysRegionMapper.deleteSysRegionByRegionids(regionids);
    }

    /**
     * 删除地区信息
     *
     * @param regionid 地区主键
     * @return 结果
     */
    @Override
    public int deleteSysRegionByRegionid(String regionid)
    {
        return sysRegionMapper.deleteSysRegionByRegionid(regionid);
    }

    /**
     * 构建前端所需要下拉树结构
     *
     * @param regions 地区列表
     * @return 下拉树结构列表
     */
    @Override
    public List<RegionTreeSelect> buildRegionTreeSelect(List<SysRegion> regions) {
        List<SysRegion> regionTrees = listToTree(regions);
        return regionTrees.stream().map(RegionTreeSelect::new).collect(Collectors.toList());
    }


    /**
     * 列表数据转树结构
     * @param treeNodes
     * @return
     */
    public List<SysRegion> listToTree(List<SysRegion> treeNodes) {
        List<SysRegion> menuTree = new ArrayList<>();
        Map<String, SysRegion> nodeMap = new HashMap<>();
        for (SysRegion node : treeNodes) {
            nodeMap.put(node.getRegionid(), node);
        }
        for (int i = 0, n = treeNodes.size(); i < n; i++) {
            SysRegion node = treeNodes.get(i);
            SysRegion pnode = nodeMap.get(node.getPid());
            if(pnode == null) {
                menuTree.add(node);
            }else {
                pnode.addChild(node);
            }
        }
        return menuTree;
    }

}
